package com.itehima.Function;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Demo05 {

    //特殊，使用类名::成员方法
    public static void main(String[] args) {


        //方法引用的规则：
        //1.需要有函数式接口
        //2.被引用的方法必须存在
        //3.被引用方法的形参，需要跟抽象方法的第二个形参到最后一个形参保持一致，返回值也需要保持一致
        //4.满足功能要求

        //对于抽象方法的解析
        //1.第一个参数：表示被引用方法的调用者，决定了可以引用那些类中的方法，
        //在stream流当中，第一个参数一般都标志流里面的每一个数据。
        //假设流里面的数据都是字符串，那么使用这种方式进行方法引用，只能引用string这个类中的方法
        //2.第二个参数到最后一个参数，跟被引用方法的参数保持一致，如果从第二个形参开始就看没有了，那么该被引用方法就是无形参的方法


        //要求，将字符串转换为大写以后输出
        //1.创建集合对象
        ArrayList<String> list = new ArrayList<>();
        //2.添加数据
        Collections.addAll(list, "aaa", "bbb", "ccc", "ddd");

        //实现转换
        //在string类中其实存在这样的方法实现
        //1.普通方式
        List<String> newlist1 = list.stream().map(String::toUpperCase).collect(Collectors.toList());
        System.out.println(newlist1);//[AAA, BBB, CCC, DDD]


//        //2.详细分析
//        list.stream().map(new Function<String, String>() {
//            @Override
//            public String apply(String s) {
//                return s.toUpperCase();
//            }
//        }).forEach(s-> System.out.println(s));

        //如果使用方法引用
       // list.stream().map(String::toUpperCase)

    }
}
